feat(resolver): Add CLI option to resolve minimal version dependencies
authorKlaus Purer <klaus.purer@gmail.com>
Sun, 18 Mar 2018 21:20:22 +0000 (22:20 +0100)
committerKlaus Purer <klaus.purer@gmail.com>
Tue, 20 Mar 2018 20:49:16 +0000 (21:49 +0100)
src/cargo/core/features.rs
src/cargo/core/resolver/mod.rs

index 4bdcc08a8c92581ebc2d0090b92dd40eff371c8c..3ce6a8267b30a0d4c615b43c41b8023689d9cf35 100644 (file)
@@ -285,6 +285,7 @@ pub struct CliUnstable {
     pub offline: bool,
     pub no_index_update: bool,
     pub avoid_dev_deps: bool,
+    pub minimal_versions: bool,
 }
 
 impl CliUnstable {
@@ -317,6 +318,7 @@ impl CliUnstable {
             "offline" => self.offline = true,
             "no-index-update" => self.no_index_update = true,
             "avoid-dev-deps" => self.avoid_dev_deps = true,
+            "minimal-versions" => self.minimal_versions = true,
             _ => bail!("unknown `-Z` flag specified: {}", k),
         }
 
index 63b13cbaaf1ba1553067fda01ad04d82daed38d5..5a8043b903621fa4c87c3e3fc6c187691eb27b5e 100644 (file)
@@ -430,7 +430,11 @@ pub fn resolve(
         warnings: RcList::new(),
     };
     let _p = profile::start("resolving");
-    let mut registry = RegistryQueryer::new(registry, replacements, try_to_use);
+    let minimal_versions = match config {
+        Some(config) => config.cli_unstable().minimal_versions,
+        None => false,
+    };
+    let mut registry = RegistryQueryer::new(registry, replacements, try_to_use, minimal_versions);
     let cx = activate_deps_loop(cx, &mut registry, summaries, config)?;
 
     let mut resolve = Resolve {
@@ -683,6 +687,7 @@ struct RegistryQueryer<'a> {
     try_to_use: &'a HashSet<&'a PackageId>,
     // TODO: with nll the Rc can be removed
     cache: HashMap<Dependency, Rc<Vec<Candidate>>>,
+    minimal_versions: bool,
 }
 
 impl<'a> RegistryQueryer<'a> {
@@ -690,12 +695,14 @@ impl<'a> RegistryQueryer<'a> {
         registry: &'a mut Registry,
         replacements: &'a [(PackageIdSpec, Dependency)],
         try_to_use: &'a HashSet<&'a PackageId>,
+        minimal_versions: bool,
     ) -> Self {
         RegistryQueryer {
             registry,
             replacements,
             cache: HashMap::new(),
             try_to_use,
+            minimal_versions,
         }
     }
 
@@ -797,7 +804,10 @@ impl<'a> RegistryQueryer<'a> {
             let b_in_previous = self.try_to_use.contains(b.summary.package_id());
             let a = (a_in_previous, a.summary.version());
             let b = (b_in_previous, b.summary.version());
-            a.cmp(&b).reverse()
+            match self.minimal_versions {
+                true => a.cmp(&b),
+                false => a.cmp(&b).reverse(),
+            }
         });
 
         let out = Rc::new(ret);